\documentclass[]{article}
\usepackage{lmodern}
\usepackage{amssymb,amsmath}
\usepackage{ifxetex,ifluatex}
\usepackage{fixltx2e} % provides \textsubscript
\ifnum 0\ifxetex 1\fi\ifluatex 1\fi=0 % if pdftex
  \usepackage[T1]{fontenc}
  \usepackage[utf8]{inputenc}
\else % if luatex or xelatex
  \ifxetex
    \usepackage{mathspec}
    \usepackage{xltxtra,xunicode}
  \else
    \usepackage{fontspec}
  \fi
  \defaultfontfeatures{Mapping=tex-text,Scale=MatchLowercase}
  \newcommand{\euro}{€}
\fi
% use upquote if available, for straight quotes in verbatim environments
\IfFileExists{upquote.sty}{\usepackage{upquote}}{}
% use microtype if available
\IfFileExists{microtype.sty}{%
\usepackage{microtype}
\UseMicrotypeSet[protrusion]{basicmath} % disable protrusion for tt fonts
}{}
\usepackage[margin=1in]{geometry}
\usepackage{graphicx}
\makeatletter
\def\maxwidth{\ifdim\Gin@nat@width>\linewidth\linewidth\else\Gin@nat@width\fi}
\def\maxheight{\ifdim\Gin@nat@height>\textheight\textheight\else\Gin@nat@height\fi}
\makeatother
% Scale images if necessary, so that they will not overflow the page
% margins by default, and it is still possible to overwrite the defaults
% using explicit options in \includegraphics[width, height, ...]{}
\setkeys{Gin}{width=\maxwidth,height=\maxheight,keepaspectratio}
\ifxetex
  \usepackage[setpagesize=false, % page size defined by xetex
              unicode=false, % unicode breaks when used with xetex
              xetex]{hyperref}
\else
  \usepackage[unicode=true]{hyperref}
\fi
\hypersetup{breaklinks=true,
            bookmarks=true,
            pdfauthor={movin},
            pdftitle={PIC 2D ReadMe},
            colorlinks=true,
            citecolor=blue,
            urlcolor=blue,
            linkcolor=magenta,
            pdfborder={0 0 0}}
\urlstyle{same}  % don't use monospace font for urls
\setlength{\parindent}{0pt}
\setlength{\parskip}{6pt plus 2pt minus 1pt}
\setlength{\emergencystretch}{3em}  % prevent overfull lines
\setcounter{secnumdepth}{5}

%%% Use protect on footnotes to avoid problems with footnotes in titles
\let\rmarkdownfootnote\footnote%
\def\footnote{\protect\rmarkdownfootnote}

%%% Change title format to be more compact
\usepackage{titling}

% Create subtitle command for use in maketitle
\newcommand{\subtitle}[1]{
  \posttitle{
    \begin{center}\large#1\end{center}
    }
}

\setlength{\droptitle}{-2em}
  \title{PIC 2D ReadMe}
  \pretitle{\vspace{\droptitle}\centering\huge}
  \posttitle{\par}
  \author{movin}
  \preauthor{\centering\large\emph}
  \postauthor{\par}
  \predate{\centering\large\emph}
  \postdate{\par}
  \date{2015年03月10日}



\begin{document}

\maketitle


{
\hypersetup{linkcolor=black}
\setcounter{tocdepth}{2}
\tableofcontents
}
\subsection{PIC2d的主要程序文件包含如下：}\label{pic2d}

\subsubsection{+ 主程序：main.cpp}\label{main.cpp}

\begin{verbatim}
+ 在这个文件中主要设置参数，以及计算流程和数据交换。现在不需要在这个文件中设置,由于文件中包含了很多宏定义,因此最好不要修改.
\end{verbatim}

\subsubsection{+ 并行库文件：mpi\_data.h}\label{mpiux5fdata.h}

在这个文件中

\begin{verbatim}
+ 定义了数据交换的格式，已经封装。
+ 定义了数据交换函数。直接在主程序中调用即可。
\end{verbatim}

\subsubsection{+ 模拟盒子文件：simbox.h}\label{simbox.h}

\begin{verbatim}
+ 定义了一个计算 domain 类，包含了数据和函数。
\end{verbatim}

\subsubsection{+ 网格文件：cellinf.h}\label{cellinf.h}

\begin{verbatim}
+ 定义了单个网格信息的类和一个二维网格群类。是simbox中的成员。
\end{verbatim}

\subsubsection{+ 场文件：fields.h}\label{fields.h}

\begin{verbatim}
+ 定义了一个 domain 中二维网格格点上的场类。是simbox中的成员。
\end{verbatim}

\subsubsection{+ 粒子文件：particles.h}\label{particles.h}

\begin{verbatim}
+ 定义了粒子信息类，还有一个粒子束类，粒子束是cell中的基本粒子描述对象。是cellinfo中的成员。
+ 粒子类也是simbox中的成员，用于越界粒子的数据操作。
\end{verbatim}

\subsubsection{+ 激光文件：laser.h}\label{laser.h}

\begin{verbatim}
+ 定义了激光类，可以在一个空间点上，取其中一个方向发射激光，形状需要自己更改，目前是高斯。是独立类，在主函数中直接调用。
\end{verbatim}

\subsubsection{+ 通用：common.h}\label{common.h}

\begin{verbatim}
+ 定义了通用函数：
+ 计算临界密度，等离子体频率，激光强度转化函数。
+ 定义了粒子信息的结构体，和粒子对象之间的拷贝函数，用于MPI传输数据。
\end{verbatim}

\subsubsection{+ 类型文件：type.h}\label{type.h}

\begin{verbatim}
+ 定义了二维矢量和三维矢量的模板类，只能是同种类型的数据，如两个double型组成一个二维double矢量等。
+ 定义了格点场数据类，包含了一个网格中左下角方格中的场数据。
+ 定义了格点场数据结构体，和拷贝函数，用于MPI数据交换。
\end{verbatim}

\subsubsection{+ 编译和运行：}

\begin{verbatim}
+ 编译采用MPIC++编译，gcc版本至少要在4.8之上（之下没有测试过），由于程序采用了c++11标准中数组初始化等新性能。
+ 编译参数建议添加 -O3 -fPIC， 第一个参数用来优化，速度提升非常明显，第二个参数是生成位置无关代码，这样链接库加载时不需要重定位，可以部分提高速度。
+ 编译指令： mpic++ main.cpp -O3 -fPIC -o xxx，可以生成xxx程序。
+ 在xxx程序同目录下创建data文件夹
+ 运行：mpirun -np N ./pathtoxxx/xxx ，生成的数据将会被保存在data文件夹中，其中N为进程个数。
+ 现在可以进行串行运算,在没有MPI的情况下,在load.inp中设置use_mpi = 0即可,这样生成的compile文件中就会成为串行编译指令.
\end{verbatim}

\subsubsection{+ 做图：}

\begin{verbatim}
+ 我自己写了一点儿Python代码画图，需要用到Python的库：Numpy，Matplotlib
+ 首先将datacombine.sh, gather.py, gathers.py拷贝到data文件夹下，运行datacombine.sh，分核数据会被整合。
+ 在data同目录应该有figures，ploter文件夹，运行ploter文件夹中的uplotme.py图片会被保存到figures中。
\end{verbatim}

\subsubsection{+ 模型}

电磁场分解为TE膜与TM膜： \[ \partial_t B_x = - \partial_y E_z, \]
\[ \partial_t B_y = \partial_x E_z,\]
\[\partial_t E_z = \partial_x B_y - \partial_y B_x - J_z, \]
\[ \partial_t B_z = -(\partial_x E_y - \partial_y E_x), \]
\[\partial_t E_x = \partial_y B_z - J_x, \]
\[\partial_t E_y = -\partial_x B_z - J_y.\]

\subsubsection{+ 数据位置示意}

\includegraphics{./cellinfo.png} grid(i, j)
仅负责临近的10个场量（不考虑电势）。

\subsubsection{+ 关于注释}

注释和程序应经通过Doxygen导出到了程序目录下的html文件夹中，直接从index.html开始查看。

\subsubsection{+ 新修改部分}

\begin{itemize}
\item
  通过设置disable\_em 可以开启或关闭电磁相互作用,以便进行纯MC过程
\item
  injector
  模块,利用此模块可以进行射入粒子束,粒子束的能量目前是单频的,但可以在其中做少量的修改得到新的入射枪,引用已经被包含在了主程序中.
\item
  densityfun 函数
  可以通过对不同位置的密度进行设定,不需要修改主程序,这部分在denfunc.h文件中.
\item
  init\_ptcls
  函数,在denfunc中定义了次函数,可以设定不同的粒子属性,原则上粒子种类数目是没有限制的,但必须等于load中的speciesall
\item
  load.inp文件中可以设置一部分参数,通过宏定义的方式传入到userdef.h文件中
\item
  通过运行precompile.py生成userdef.h和compile,compile会根据load.inp中是否启用MPI编译最终的可执行程序.
\end{itemize}

\end{document}
